package com.autumn.scheduler.api.services;

import java.util.Date;
import java.util.List;

import com.autumn.common.api.application.dto.input.PageQueryInput;
import com.autumn.common.api.application.dto.output.IPageQueryResult;
import com.autumn.scheduler.api.QueueSchedulerStatus;
import com.autumn.scheduler.api.services.dto.input.AutumnJobDetailsAddInput;
import com.autumn.scheduler.api.services.dto.input.AutumnJobDetailsUpdateInput;
import com.autumn.scheduler.api.services.dto.output.AutumnJobDetailsOutput;
import com.autumn.scheduler.api.services.dto.output.AutumnJobLogOutput;

public interface AutumnJobService {

	/**
	 * 根据id判断是否存在任务
	 * 
	 * @param id
	 *            作业id
	 * @return
	 *
	 */
	boolean existJobById(long id);

	/**
	 * 根据名称判断是否存在任务
	 * 
	 * @param jobGroup
	 *            任务组名称
	 * @param jobName
	 *            任务名称
	 * @return
	 *
	 */
	boolean existJobByName(String jobGroup, String jobName);

	/**
	 * 添加作业
	 *
	 * @param input
	 *            输入
	 * @return 返回任务详情
	 */
	AutumnJobDetailsOutput addJob(AutumnJobDetailsAddInput input);

	/**
	 * 删除作业
	 *
	 * @param id
	 *            主键
	 */
	boolean deleteJob(long id);

	/**
	 * 触发任务
	 *
	 * @param id
	 *            主键
	 */
	void triggerJob(long id);
	

	/**
	 * 暂停任务
	 *
	 * @param id
	 */
	boolean pauseJob(long id);

	/**
	 * 全部暂停
	 */
	int pauseAllJob();

	/**
	 * 恢复任务
	 *
	 * @param id
	 */
	boolean resumeJob(long id);

	/**
	 * 全部恢复
	 *
	 * @param id
	 */
	int resumeAllJob();

	/**
	 * 获取作业
	 *
	 * @param id
	 *            主键
	 */
	AutumnJobDetailsOutput getJob(long id);

	/**
	 * 更新作业
	 *
	 * @param input
	 *            输入
	 * @return 返回任务详情
	 */
	AutumnJobDetailsOutput updateJob(AutumnJobDetailsUpdateInput input);

	/**
	 * 任务查询
	 *
	 * @param input
	 *            输入
	 * @return 返回分页查询
	 */
	IPageQueryResult<AutumnJobDetailsOutput> jobQuery(PageQueryInput input);

	/**
	 * 日志查询
	 *
	 * @param input
	 *            输入
	 * @return 返回分页查询
	 */
	IPageQueryResult<AutumnJobLogOutput> logQuery(PageQueryInput input);

	/**
	 * 清除所有作业日志
	 */
	void clearAllJobLog();

	/**
	 * 获取作业调度时间列表
	 * 
	 * @param cronExpression 表达式
	 * @param startTime 开始时间
	 * @param numTimes 时钟数
	 * @return
	 */
	List<Date> getJobFireTimeList(String cronExpression, Date startTime, int numTimes);
	
	/**
	 * 更新作业状态
	 *
	 * @param status
	 *            状态
	 */
	int updateJobStatus(QueueSchedulerStatus status);
}
